package fr.babos.core.bootstrap 
{
	/**
	 * Les imports
	 */
	import flash.display.DisplayObjectContainer;
	import fr.babos.core.dependences.IDependencesManager;
	import fr.babos.core.mvc.IController;
	import fr.babos.core.mvc.IView;
	import fr.babos.core.roles.IDisposable;
	import fr.babos.navigation.routes.IRouter;
	import org.osflash.signals.DeluxeSignal;
	
	/**
	 * @author ZoulouX & Pascal
	 */
	public interface IBootstrap extends IDisposable
	{
		/**
		 * Le mapping des commandes
		 */
		function get commands ():Array;
		function set commands (pValue:Array):void;
		
		/**
		 * Le controlleur en cours d'utilisation. Peut-être null.
		 */
		function get currentController ():IController;
		
		/**
		 * L'attente entre commande par défaut
		 */
		function get defaultWaitFor ():uint;
		function set defaultWaitFor (value:uint):void;
		
		/**
		 * Les vues en cours
		 */
		function get currentViews ():Array;
		
		/**
		 * La commande est en train de changer (les controlleurs et vues ne sont pas encore instanciées)
		 */
		function get onCommandChanging ():DeluxeSignal;
		
		/**
		 * La commande a changé (tout est instancié et animé)
		 */
		function get onCommandChanged ():DeluxeSignal;
		
		/**
		 * Le manager de dépendences de dépendences
		 */
		function get dependencesManager ():IDependencesManager;
		function set dependencesManager (value:IDependencesManager):void;
		
		/**
		 * Le conteneur pour les vues
		 */
		function get viewContainer ():DisplayObjectContainer;
		function set viewContainer (pValue:DisplayObjectContainer):void;
		
		/**
		 * Récupérer une commande
		 * @param	pCommandName : Le nom de la commande à récupérer
		 */
		function getCommand (pCommandName:String):CommandItem;
		
		/**
		 * Ajouter une commande
		 * @param	pCommandName : Le nom de la commande
		 * @param	pController : La classe du controlleur qui doit être instancié
		 * @param	pAction : L'action à appeler sur le controlleur
		 * @param	pViews : Les classes des vues qui doivent être instanciées
		 * @param	pWaitFor : Quel entité attendre pour passer à la commande suivante. Voir les statiques de Bootstrap pour plus d'informations sur les options possibles.
		 * @param	pCallback : Handler appelé lorsque la commande est interceptée
		 */
		function addCommand (pCommandName:String, pController:Class, pAction:String, pViews:Array = null, pWaitFor:int = -2, pCallback:Function = null):void;
		
		/**
		 * Supprimer une commande
		 * @param	pCommandName : Le nom de la commande
		 */
		function removeCommand (pCommandName:String):void;
		
		/**
		 * Ouvrir une commande
		 * @param	pCommandName : Le nom de la commande
		 * @param	pParams : Les paramètres associés à cette commande
		 */
		function open (pCommandName:String, pParams:Object = null):void;
		
		/**
		 * Virer toutes les commandes
		 */
		function reset ():void;
	}
}